package com.springboot.mybatis.service.collectiondemo;

import com.springboot.mybatis.entity.Student;

import java.util.ArrayList;
import java.util.Collections;

public class LambdaDemo {
    public static void main(String[] args) {
        //利用 lambda表达式的接口快速指向一个已经被实现的方法
        //方法归属者::方法名 静态方法的归属者为类名，普通方法归属者为对象
        //三种方式调用已实现的方法，传参和得到方法返回
        //a为参数，doubleNum(a)为方法体
        ReturnOneParam lambda1 = a -> doubleNum(a);
        System.out.println(lambda1.method(3));

        //lambda2 引用了已经实现的 doubleNum 方法
        //doubleNum为static型的，所以需要用类名作为方法归属者
        ReturnOneParam lambda2 = LambdaDemo::doubleNum;
        System.out.println(lambda2.method(3));

        LambdaDemo exe = new LambdaDemo();

        //lambda4 引用了已经实现的 addTwo 方法
        //addTwo为普通型的，所以需要用对象名作为方法归属者
        ReturnOneParam lambda4 = exe::addTwo;
        System.out.println(lambda4.method(2));

        //用Lambda表达式创建线程---原先用匿名内部类来重写Thread对象的run方法进行创建，Lambda可以更优雅
        Thread t = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                System.out.println(2 + ":" + i);
            }
        });
        t.start();


        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list, 1,2,3,4,5);

        //用lambda表达式遍历集合元素
        list.forEach(System.out::println);
        list.forEach(element -> {
            if (element % 2 == 0){
                System.out.println(element);
            }
        });

        //用lambda表达式做删除集合中元素，如果等于3，则删除
        list.removeIf(ele -> ele.equals(3));
        //通过 foreach 遍历，查看是否已经删除
        list.forEach(System.out::println);

        //集合的排序
        list.sort((o1,o2) -> o2-o1);
        list.forEach(System.out::println);

        //定义一个对象数组集合
        ArrayList<Student> arrayList = new ArrayList<Student>();
        Student student1 = new Student(1,"cc");
        Student student2 = new Student(2,"xx");
        Student student3 = new Student(3,"ggg");
        arrayList.add(student1);
        arrayList.add(student2);
        arrayList.add(student3);

        //循环输出元素
        arrayList.forEach(e -> {
            System.out.println(e.getName()+" "+e.getSc());
        });
        arrayList.get(0).setSc(arrayList.get(1).getSc());
//        ArrayList<Student> test = new ArrayList<>();
        arrayList.stream().filter(e -> e.getName().equals("cc")).forEach(e -> {
            System.out.println(e.getName()+" "+e.getSc());
        });
    }

    /**一个参数有返回值*/
    @FunctionalInterface
    public interface ReturnOneParam {
        int method(int a);
    }

    public static int doubleNum(int a) {
        return a * 2;
    }

    public int addTwo(int a) {
        return a + 2;
    }


}
